package com.zxm.util;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Random;
import java.util.Set;

import org.springframework.beans.propertyeditors.StringArrayPropertyEditor;

import com.zxm.bo.RedBo;
import com.zxm.redis.RedisClusterUtil;
import com.zxm.result.RedSortedResult;

import redis.clients.jedis.JedisCluster;
import redis.clients.jedis.Tuple;

public class RedUtil {

	/**
	 * 先随机产生一定数额的金额 单位是分
	 * 然后将产生的随机金额存到redis中的List中
	 * 模仿用队列的形式
	 * 
	 * 随机数红包队列  添加到redis中
	 * redKey 红包的key
	 * redbo 产生随金额的条件
	 */
	public static boolean push2List(JedisCluster jedisCluster,String redKey,RedBo redbo) {
		//产生随机金额  需要设置参与人所抢红包金额的最大值随机值 最小值随机值 最小值
		//总金额  100元
		int total = redbo.getTotal();
		//最大随机金额
		int max = redbo.getMax();
		//红包总个数
		int count = redbo.getCount();
		//最小随机数
		int min = redbo.getMin();
		int sum = 0;
		Random random= new Random();
		RedisClusterUtil.multi(jedisCluster, redKey);
		String[] strings = new String[count];
		for(int i=0;i<count;i++) {
			int r = 0;
			//随机生成   要保证总金额-随机生成的数的总和 的结果大于num-i-1
			max = max>total-sum?(total-sum):max; 
			max = max - ((count-i-1)*min);
			if(i<count-1) {
				r = random.nextInt(max)+min;
			}else {
				r = total-sum;
			}
			sum += r;
			strings[i] = String.valueOf(r);
		}
		try {
			RedisClusterUtil.lpush(redKey, strings);
			RedisClusterUtil.exec();
			return true;
		} catch (Exception e) {
			RedisClusterUtil.discard();
			return false;
		}
	}

	/**
	 * 抢红包  
	 * 
	 *  使用lpop(redKey)方法 从队列的右边获取
	 *  返回值是抢到的数额
	 */
	public static int start(JedisCluster jedisCluster,String redKey) {
		String lpop = jedisCluster.lpop(redKey);
		return Integer.valueOf(lpop);
	}
	
	/**
	 * 添加到sorted set 自动排序
	 * 添加到排行榜中
	 * amount 强到的金额
	 */
	public static boolean add2Sort(JedisCluster jedisCluster,String redKey,Long userId,Integer amount) {
		//开启事务
		RedisClusterUtil.multi(jedisCluster, redKey);
		Map<String, Double> scoreMembers = new HashMap<>();
		//将用户id和抢到的金额放在map中
		scoreMembers.put(String.valueOf(userId), Double.valueOf(amount));
		//添加至排行榜
		try {
			RedisClusterUtil.zadd(redKey, scoreMembers);
			RedisClusterUtil.exec();
			return true;
		} catch (Exception e) {
			RedisClusterUtil.discard();
			return false;
		}
	}
	
	/**
	 * 查看排行榜
	 */
	public static List<RedSortedResult> getSorted(JedisCluster jedisCluster,String sortedKey,Integer start,Integer end){
		List<RedSortedResult> list = new ArrayList<>();
		//降序查看
		Set<Tuple> scores = jedisCluster.zrevrangeWithScores(sortedKey,start,end);
		for(Tuple t:scores) {
			//用户
			String userId = t.getElement();
			Double score = t.getScore();
			RedSortedResult result = new RedSortedResult(Long.valueOf(userId),"ha",score.intValue());
			list.add(result);
		}
		return list;
	}
	
}
